/**XSS跨站脚本攻击
反射型XSS:直接将HTTP请求中的用户可控数据输出到HTML页面中的跨站脚本注入，由于用户可控数据没有被存储，因此只能在单次请求中生效。
存储型XSS:又叫特久型XSS，直接将HTTP请求中的用户可控数据存储至数据库中，再从数据库中读取出来输出到HTML页面上，由于数据经过存储，可以持续被读取，攻击影响面和危害都较高。
*/ 

/**CSRF跨站请求伪造 
 攻击者会伪造一个请求（这个请求一般是一个链接），然后欺骗目标用户进行点击，用户一旦点击了这个请求，
 可能会下载一个木马或者是一个钓鱼网站迷惑你输入隐私信息。
 
 用户在浏览器中保持登录状态并访问了目标网站，那么浏览器会在请求中自动携带目标网站的cookie信息，
 即使是在恶意网站上发起的请求也不例外。这是因为浏览器在发送请求时会自动将与目标网站相关的cookie信息包含在请求头中，
 以便目标网站能够识别用户并执行相应的操作。目标网站若无法区分请求的真伪，攻击者就很容易利用你的信息去目标网址做一些期望行为。
 
 措施：目标网站可以使用CSRF令牌、检查Referer头、使用双重身份验证等，以确保请求的合法性。真正杜绝还是得用户不要随意点击不明链接。或把重要信息保留在cookie。
 缺点：如果浏览器有问题，referer也能伪造。
 解决: 使用jwt-json web token 身份验证。
*/






/*SESSION-会话控制
   服务器保存用户状态的一种方式，以key-value的方式存储数据，一般存放在服务器的内存中。
   sessionid各个服务器生成的方式不一样，一般是加密哈希函数或随机字符串 并与其他字符串结合一起生成。

   流程：
   用户登录时候，服务端创建SESSION_ID,并在数据库保存一份,然后在响应头的set-cookie字段会携带上session_id

   之后，都会携带上cookie，服务器可以从请求头中得到cookie，根据sessionid搜索目前会话有无该session，有的话
   会直接搜索数据库/缓存返回数据，无需重新登录。

   缺点: 并发量高会增加服务器，还有安全问题，比如CSRF (跨站请求伪造攻击) 
   解决: ↑ 分布式session|jwt    ↑ jwt
 */

/*JWT(JSON Web Token)一种跨域认证解决方案，由服务器生成token，但存储在客户端

    服务器生成:(头部、载荷为json)
    第一部分：头部: {描述JWT的元数据:签名算法,type:JWT} 
    第二部分：载荷: {用户信息:用户名,账号,有效时间...} (有效时间,可以判断token是否过期。)
    第三部分：签名字符串

    解释：
    字符串: base64(头部) . base64(载荷)
    签名字符串: 通过指定算法和私钥 对 字符串进行签名,得到一个签名字符串


    Token的返回方式: URL | BODY | heder | cookie 

    客户端:
    1、请求头中的authorization字段，需要携带Bearer token
    2、在验证 JWT 时，需要将这三部分信息重新组合起来，并使用相同的算法和密钥对头部和载荷进行签名，
       然后将生成的签名字符串与 JWT 中的签名字符串进行比较，以确定 JWT 是否被正确。



    优点:减轻服务器的内存压力,也更安全,消耗服务器性能主要在加解密的过程，某些场景可以减轻服务器压力。
    缺点:1.JWT一般比session数据量要大，会增加请求的时间
        2.也有一定的安全隐患,JWT依赖密钥和算法的保护,如果密钥泄露,攻击者用同样的信息和算法伪造jwt,从而访问受保护的资源。
          所以一般不会长时间有效，一般分钟或者小时为单位。
        3.一定指定了过期时间,就无法像session那样随时让它失效(可用redis解决,每次使用jwt去查redis判断这个token是否被置为失效)

   
    使用场景：
    jwt: 无状态,修改内容需要重新签发jwt, 所以可以用于只需要使用一次的场景，比如身份验证(邮箱激活,token几个小时内有效)        
    Session  服务器为了保存用户状态而创建的一个特殊的对象。 (登录,购物车)

    总结：token可以说短时间内有很强的安全性，且可以减轻服务器压力，长时间保存状态，无论token还是session都有一定的安全隐患。
    要用哪一种状态认证,还是得看具体需求,无论哪一种技术都要做好数据的加密和密钥的有效时间。


    jwt为什么要用公私钥? (因为更安全)
    服务器会生成一对公钥和私钥，将公钥传输给客户端，客户端使用公钥对 Token 进行加密，然后将加密后的 Token 发送给服务器。

    使用公钥私钥加解密的方式时，服务器会生成一对公钥和私钥，
    将公钥传输给客户端，客户端使用公钥对 Token 进行加密，然后将加密后的 Token 发送给服务器。
    服务器使用私钥对 Token 进行解密，从而获取客户端的身份认证信息和授权信息。



*/

/*JWT另一种方案(技术只是一个术语,过程是灵活的,不是固定死的。)

另外一种用法，给出去的token只是一个随机数，通过签名后，
存到reids里面与用户信息对应；redis设置过期时间；每次来请求，先看是否过期；
没有过期再看是不是通过签名校验；同时拿到用户信息，存本地context。

*/


/**分布式SESSION
 * 当并发量上去了，单台服务器根本承受不了，自然需要做集群，也就需要多台服务器来提供服务。
 * 
 * 那不同服务器之间的 session 怎么同步？(分布式会话)
 * 1.SESSION复制，每次修改都会同步，由对应框架来实现
 * 2.保存在Redis,所有服务器都去一个ip查,自然不需要复制(redis+session)
 */